1 Statistically Analyzing the G.O.A.T. Debate

1.1 Abstract

1.1.1 Overall Purpose of My Study

The Greatest of All Time (G.O.A.T.) discussion is an age old debate typically involving superstars LeBron James and Michael Jordan who each dominated in their respective eras of the NBA. Each considered the greatest of THEIR time, fans have long contested which is the greatest of ALL time. This is my attempt to finally settle this debate with statistics!

1.1.2 Basic Design of My Study

For this analysis, I performed a Two Sample t-test (Independent Samples). The observation of interest is points-per-game scored by each player during their respective careers. The basis of my study is to simply determine if the mean points scored per game by both players differ significantly, and therefore determine which player made the larger impact.

1.1.3 Major Findings + Short Summary of My Study

As an avid fan of sports and the NBA in particular, my favorite player between the two is Michael Jordan. However, I approached this analysis fairly and objectively to statistically prove which player is the greatest of all time based on the significance of mean points-per-game scored. By conducting the Two Sample t-test, it was determined that Michael Jordan indeed had a significantly higher mean points-per-game scored over his career than LeBron James currently has. With a p-value (0.00) less than any reasonable alpha level, it is determined that Michael Jordan is officially the G.O.A.T. of professional basketball!


1.2 Introduction

1.2.1 Question of Interest

LeBron James vs. Michael Jordan who is the Greatest of All Time (G.O.A.T)?

1.2.2 Why Should You Be Interested?

There can be many greats, but only one absolute greatest of all time. For my NBA fans, this is a fun debatable topic that I felt would be fun to analyze statistically.

1.2.3 How I Plan to Address this Question

I will utilize career stats for both LeBron James and Michael Jordan to perform a Two Sample t-test.


1.3 Personal Information

Hello! My name is Derrick Joyce and I am a graduating senior with a Bachelor of Science in Computer Engineering with a minor in Mathematical Sciences. I am an avid sports fan which was my inspiration for this topic. I plan to start graduate school this upcoming fall to pursue a Masters in Robotics!


2 Data Management

2.2 Data Collection Method

From the above links, I copied the statistics for each game that the player played. I ignored games where the player was injured or inactive because they are not physically contributing to the game.

2.3 Import Raw Data

2.3.1 LeBron James Career Stats:

lebron = read_excel("LEBRON_STATS.xlsx", skip = 1)

datatable(lebron)

2.3.2 Michael Jordan Career Stats:

mj = read_excel("MJ_STATS.xlsx", skip = 1)

datatable(mj)

2.4 Select Game Number and PTS (Points)

2.4.1 LeBron James Points Per Game (PPG)

#Select Game_Number and PTS
lebron_pts = lebron %>%
  select(G, PTS) %>%
  na.omit() %>%
  summarise(Game_Number = G,
            LEBRON_PTS = PTS)


datatable(lebron_pts)

2.4.2 Michael Jordan Points Per Game (PPG)

#Select Game_Number and PTS
mj_pts = mj %>%
  select(G, PTS) %>%
  na.omit() %>%
  summarise(Game_Number = G,
            MJ_PTS = PTS)

datatable(mj_pts)

2.5 Join by Game Number To Get Final Data Table

#inner join to include only the games that each played
pts = inner_join(mj_pts, lebron_pts, by = "Game_Number") %>%
  select(-Game_Number)

datatable(pts)

3 Descriptive Statistics

3.1 Pivot Data

#Pivot the data
pts_pivot = pts %>%
  pivot_longer("LEBRON_PTS":"MJ_PTS",names_to = "Player", values_to = "PTS")

datatable(pts_pivot)

3.2 Summary Statistics

#Gather summary statistics
pts_summary = pts_pivot %>%
  group_by(Player) %>%
  summarise(n = n(),
            mean = mean(PTS, na.rm = TRUE),
            sd = sd(PTS, na.rm = TRUE))

knitr::kable(pts_summary)
Player n mean sd
LEBRON_PTS 1020 27.17745 7.946020
MJ_PTS 1020 30.22059 9.805436

This study analyzes 1020 games played by LeBron James and Michael Jordan. The mean points-per-game scored by LeBron is approximately 27.18 and Michael’s is 30.22. From a surface level view, it is clear that Michael had a higher average points-per-game scored, but the question remains: is it a statistically significant difference? In the context of a basketball game, a 3 point deficit is a small margin. However, in the context of statistics, the significance is yet to be determined. Next we will visualize the data to get a better understanding of the distribution.

3.3 Data Visualizations

3.3.1 Histogram

#histogram
hist <- pts_pivot %>%
  ggplot(mapping=aes(x = PTS, fill=Player)) +
  geom_histogram(binwidth = 5) 

hist

From the histogram, it is clear that although Michael Jordan has a slightly higher mean points-per-game than LeBron James, LeBron has a much higher point total than Michael throughout the sample 1020 games. This raises the question: How could LeBron have more total points but a smaller mean overall? This is because the data analyzes points-per-game, not total points scored. This indicates that LeBron may have many outliers (games where he scored much more or much less than normal). Therefore we can conclude that LeBron has scored much more points overall, but on a per-game basis, Michael Jordan has the higher average point total.

3.3.2 Boxplot

# boxplot
bp <- pts_pivot %>%
  ggplot(mapping=aes(x=PTS, fill=Player)) +
  geom_boxplot(outlier.color = "#F56600", 
               outlier.size = 3.0) 
bp

A similar conclusion can be drawn from the boxplot. What we can clearly see is the high number of outliers for LeBron’s point totals which could be skewing the data. These outliers are reasonable within the context of basketball because player performance varies throughout the season due to numerous external factors. However, it is still clear that Michael Jordan retains the higher mean points-per-game. This is important to note because LeBron James played more games total than Michael Jordan so analyzing mean points-per-game is a more accurate representation than simply total points scored.

3.3.3 QQPlot

# qq plot
ggqqplot(pts_pivot, x="PTS", facet.by = "Player")

The QQPlot confirms that both datasets follow an approximiately normal distribution. There is insufficient evidence to suggest otherwise.


4 Analysis

4.1 Perform Two Sample T Test

\[ H_0: \mu_1 = \mu_2 \]

\[ H_A: \mu_1 \ne \mu_2 \]

# perform t test
test <- pts_pivot %>% 
  t_test(PTS ~ Player) %>%
  add_significance()

# nice print of output
knitr:: kable(test, align="c", format = "html") %>%
  kableExtra::kable_styling(full_width = FALSE)
.y. group1 group2 n1 n2 statistic df p p.signif
PTS LEBRON_PTS MJ_PTS 1020 1020 -7.700751 1954.09 0 ****

Out of the sample 1020 games analyzed by each player, I performed a hypothesis test to determine if the mean points-per-game scored by Michael Jordan and LeBron James were significantly different in a statistical point-of-view. The resulting p-value is 0.00 which is much lower than a reasonable alpha level.

5 Summary

A two-sample t-test was computed to determine whether the population mean points-per-game by Michael Jordan was significantly higher from the population mean points-per-game by LeBron James.

Since the p-value (0) is less than any reasonable alpha level, we reject our null hypothesis. There IS sufficient evidence to suggest that the population mean points-per-game scored by Michael Jordan is significantly greater than the population mean points-per-game scored by LeBron James.

LS0tDQp0aXRsZTogJ0xlQnJvbiBKYW1lcyB2cy4gTWljaGFlbCBKb3JkYW4nDQpzdWJ0aXRsZTogIkxldCdzIEZpbmFsbHkgU2V0dGxlIHRoZSBHLk8uQS5ULiBEZWJhdGUhIg0KYXV0aG9yOiAiRGVycmljayBKb3ljZSINCmRhdGU6ICIyMDIzLTA0LTEzIg0Kb3V0cHV0Og0KICAgIGh0bWxfZG9jdW1lbnQ6DQogICAgICAjY3NzOiBib290c3RyYXAubWluLmNzcw0KICAgICAgdGhlbWU6IGpvdXJuYWwNCiAgICAgIGRmX3ByaW50OiBwYWdlZA0KICAgICAgdG9jOiBUUlVFDQogICAgICB0b2NfZGVwdGg6IDINCiAgICAgIHRvY19mbG9hdDogVFJVRQ0KICAgICAgbnVtYmVyX3NlY3Rpb25zOiBUUlVFDQogICAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KPGNlbnRlcj4NCg0KIVtdKE1KLWFuZC1MQkouanBnKXt3aWR0aD0xMDAlfQ0KDQo8L2NlbnRlcj4NCg0KIyBTdGF0aXN0aWNhbGx5IEFuYWx5emluZyB0aGUgRy5PLkEuVC4gRGViYXRlIHsudGFic2V0fQ0KDQojIyBBYnN0cmFjdA0KDQojIyMgT3ZlcmFsbCBQdXJwb3NlIG9mIE15IFN0dWR5DQoNClRoZSBHcmVhdGVzdCBvZiBBbGwgVGltZSAoRy5PLkEuVC4pIGRpc2N1c3Npb24gaXMgYW4gYWdlIG9sZCBkZWJhdGUgdHlwaWNhbGx5IGludm9sdmluZyBzdXBlcnN0YXJzIExlQnJvbiBKYW1lcyBhbmQgTWljaGFlbCBKb3JkYW4gd2hvIGVhY2ggZG9taW5hdGVkIGluIHRoZWlyIHJlc3BlY3RpdmUgZXJhcyBvZiB0aGUgTkJBLiBFYWNoIGNvbnNpZGVyZWQgdGhlIGdyZWF0ZXN0IG9mIFRIRUlSIHRpbWUsIGZhbnMgaGF2ZSBsb25nIGNvbnRlc3RlZCB3aGljaCBpcyB0aGUgZ3JlYXRlc3Qgb2YgQUxMIHRpbWUuIFRoaXMgaXMgbXkgYXR0ZW1wdCB0byBmaW5hbGx5IHNldHRsZSB0aGlzIGRlYmF0ZSB3aXRoIHN0YXRpc3RpY3MhDQoNCiMjIyBCYXNpYyBEZXNpZ24gb2YgTXkgU3R1ZHkNCg0KRm9yIHRoaXMgYW5hbHlzaXMsIEkgcGVyZm9ybWVkIGEgVHdvIFNhbXBsZSB0LXRlc3QgKEluZGVwZW5kZW50IFNhbXBsZXMpLiBUaGUgb2JzZXJ2YXRpb24gb2YgaW50ZXJlc3QgaXMgcG9pbnRzLXBlci1nYW1lIHNjb3JlZCBieSBlYWNoIHBsYXllciBkdXJpbmcgdGhlaXIgcmVzcGVjdGl2ZSBjYXJlZXJzLiBUaGUgYmFzaXMgb2YgbXkgc3R1ZHkgaXMgdG8gc2ltcGx5IGRldGVybWluZSBpZiB0aGUgbWVhbiBwb2ludHMgc2NvcmVkIHBlciBnYW1lIGJ5IGJvdGggcGxheWVycyBkaWZmZXIgc2lnbmlmaWNhbnRseSwgYW5kIHRoZXJlZm9yZSBkZXRlcm1pbmUgd2hpY2ggcGxheWVyIG1hZGUgdGhlIGxhcmdlciBpbXBhY3QuDQoNCiMjIyBNYWpvciBGaW5kaW5ncyArIFNob3J0IFN1bW1hcnkgb2YgTXkgU3R1ZHkNCg0KQXMgYW4gYXZpZCBmYW4gb2Ygc3BvcnRzIGFuZCB0aGUgTkJBIGluIHBhcnRpY3VsYXIsIG15IGZhdm9yaXRlIHBsYXllciBiZXR3ZWVuIHRoZSB0d28gaXMgTWljaGFlbCBKb3JkYW4uIEhvd2V2ZXIsIEkgYXBwcm9hY2hlZCB0aGlzIGFuYWx5c2lzIGZhaXJseSBhbmQgb2JqZWN0aXZlbHkgdG8gc3RhdGlzdGljYWxseSBwcm92ZSB3aGljaCBwbGF5ZXIgaXMgdGhlIGdyZWF0ZXN0IG9mIGFsbCB0aW1lIGJhc2VkIG9uIHRoZSBzaWduaWZpY2FuY2Ugb2YgbWVhbiBwb2ludHMtcGVyLWdhbWUgc2NvcmVkLiBCeSBjb25kdWN0aW5nIHRoZSBUd28gU2FtcGxlIHQtdGVzdCwgaXQgd2FzIGRldGVybWluZWQgdGhhdCBNaWNoYWVsIEpvcmRhbiBpbmRlZWQgaGFkIGEgc2lnbmlmaWNhbnRseSBoaWdoZXIgbWVhbiBwb2ludHMtcGVyLWdhbWUgc2NvcmVkIG92ZXIgaGlzIGNhcmVlciB0aGFuIExlQnJvbiBKYW1lcyBjdXJyZW50bHkgaGFzLiBXaXRoIGEgcC12YWx1ZSAoMC4wMCkgbGVzcyB0aGFuIGFueSByZWFzb25hYmxlIGFscGhhIGxldmVsLCBpdCBpcyBkZXRlcm1pbmVkIHRoYXQgTWljaGFlbCBKb3JkYW4gaXMgb2ZmaWNpYWxseSB0aGUgRy5PLkEuVC4gb2YgcHJvZmVzc2lvbmFsIGJhc2tldGJhbGwhDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgSW50cm9kdWN0aW9uDQoNCiMjIyBRdWVzdGlvbiBvZiBJbnRlcmVzdA0KDQpMZUJyb24gSmFtZXMgdnMuIE1pY2hhZWwgSm9yZGFuDQp3aG8gaXMgdGhlIEdyZWF0ZXN0IG9mIEFsbCBUaW1lIChHLk8uQS5UKT8NCg0KIyMjIFdoeSBTaG91bGQgWW91IEJlIEludGVyZXN0ZWQ/DQoNClRoZXJlIGNhbiBiZSBtYW55IGdyZWF0cywgYnV0IG9ubHkgb25lIGFic29sdXRlIGdyZWF0ZXN0IG9mIGFsbCB0aW1lLiBGb3IgbXkgTkJBIGZhbnMsIHRoaXMgaXMgYSBmdW4gZGViYXRhYmxlIHRvcGljIHRoYXQgSSBmZWx0IHdvdWxkIGJlIGZ1biB0byBhbmFseXplIHN0YXRpc3RpY2FsbHkuDQoNCiMjIyBIb3cgSSBQbGFuIHRvIEFkZHJlc3MgdGhpcyBRdWVzdGlvbg0KDQpJIHdpbGwgdXRpbGl6ZSBjYXJlZXIgc3RhdHMgZm9yIGJvdGggTGVCcm9uIEphbWVzIGFuZCBNaWNoYWVsIEpvcmRhbiB0byBwZXJmb3JtIGEgVHdvIFNhbXBsZSB0LXRlc3QuDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIFBlcnNvbmFsIEluZm9ybWF0aW9uDQoNCjxjZW50ZXI+DQoNCiFbXShNZS0yMDIxIS5qcGcpe3dpZHRoPTMwJX0NCg0KPC9jZW50ZXI+DQoNCkhlbGxvISBNeSBuYW1lIGlzIERlcnJpY2sgSm95Y2UgYW5kIEkgYW0gYSBncmFkdWF0aW5nIHNlbmlvciB3aXRoIGEgQmFjaGVsb3Igb2YgU2NpZW5jZSBpbiBDb21wdXRlciBFbmdpbmVlcmluZyB3aXRoIGEgbWlub3IgaW4gTWF0aGVtYXRpY2FsIFNjaWVuY2VzLiBJIGFtIGFuIGF2aWQgc3BvcnRzIGZhbiB3aGljaCB3YXMgbXkgaW5zcGlyYXRpb24gZm9yIHRoaXMgdG9waWMuIEkgcGxhbiB0byBzdGFydCBncmFkdWF0ZSBzY2hvb2wgdGhpcyB1cGNvbWluZyBmYWxsIHRvIHB1cnN1ZSBhIE1hc3RlcnMgaW4gUm9ib3RpY3MhDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KDQoNCiMgRGF0YSBNYW5hZ2VtZW50DQoNCiMjIERhdGEgTGlua3MNCltNaWNoYWVsIEpvcmRhbiBDYXJlZXIgU3RhdHNdKGh0dHBzOi8vd3d3LmJhc2tldGJhbGwtcmVmZXJlbmNlLmNvbS9wbGF5ZXJzL2ovam9yZGFtaTAxLmh0bWwpDQoNCltMZUJyb24gSmFtZXMgQ2FyZWVyIFN0YXRzXShodHRwczovL3d3dy5iYXNrZXRiYWxsLXJlZmVyZW5jZS5jb20vcGxheWVycy9qL2phbWVzbGUwMS5odG1sKQ0KDQojIyBEYXRhIENvbGxlY3Rpb24gTWV0aG9kDQoNCkZyb20gdGhlIGFib3ZlIGxpbmtzLCBJIGNvcGllZCB0aGUgc3RhdGlzdGljcyBmb3IgZWFjaCBnYW1lIHRoYXQgdGhlIHBsYXllciBwbGF5ZWQuIEkgaWdub3JlZCBnYW1lcyB3aGVyZSB0aGUgcGxheWVyIHdhcyBpbmp1cmVkIG9yIGluYWN0aXZlIGJlY2F1c2UgdGhleSBhcmUgbm90IHBoeXNpY2FsbHkgY29udHJpYnV0aW5nIHRvIHRoZSBnYW1lLg0KDQojIyBJbXBvcnQgUmF3IERhdGENCg0KYGBge3IgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkocnN0YXRpeCkNCmxpYnJhcnkoRFQpDQpgYGANCg0KIyMjIExlQnJvbiBKYW1lcyBDYXJlZXIgU3RhdHM6DQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KbGVicm9uID0gcmVhZF9leGNlbCgiTEVCUk9OX1NUQVRTLnhsc3giLCBza2lwID0gMSkNCg0KZGF0YXRhYmxlKGxlYnJvbikNCmBgYA0KDQoNCiMjIyBNaWNoYWVsIEpvcmRhbiBDYXJlZXIgU3RhdHM6DQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KbWogPSByZWFkX2V4Y2VsKCJNSl9TVEFUUy54bHN4Iiwgc2tpcCA9IDEpDQoNCmRhdGF0YWJsZShtaikNCmBgYA0KDQoNCiMjIFNlbGVjdCBHYW1lIE51bWJlciBhbmQgUFRTIChQb2ludHMpDQoNCiMjIyBMZUJyb24gSmFtZXMgUG9pbnRzIFBlciBHYW1lIChQUEcpDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQoNCiNTZWxlY3QgR2FtZV9OdW1iZXIgYW5kIFBUUw0KbGVicm9uX3B0cyA9IGxlYnJvbiAlPiUNCiAgc2VsZWN0KEcsIFBUUykgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlKEdhbWVfTnVtYmVyID0gRywNCiAgICAgICAgICAgIExFQlJPTl9QVFMgPSBQVFMpDQoNCg0KZGF0YXRhYmxlKGxlYnJvbl9wdHMpDQoNCg0KYGBgDQoNCiMjIyBNaWNoYWVsIEpvcmRhbiBQb2ludHMgUGVyIEdhbWUgKFBQRykNCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCg0KI1NlbGVjdCBHYW1lX051bWJlciBhbmQgUFRTDQptal9wdHMgPSBtaiAlPiUNCiAgc2VsZWN0KEcsIFBUUykgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlKEdhbWVfTnVtYmVyID0gRywNCiAgICAgICAgICAgIE1KX1BUUyA9IFBUUykNCg0KZGF0YXRhYmxlKG1qX3B0cykNCg0KYGBgDQoNCg0KDQojIyBKb2luIGJ5IEdhbWUgTnVtYmVyIFRvIEdldCBGaW5hbCBEYXRhIFRhYmxlDQoNCg0KYGBge3J9DQojaW5uZXIgam9pbiB0byBpbmNsdWRlIG9ubHkgdGhlIGdhbWVzIHRoYXQgZWFjaCBwbGF5ZWQNCnB0cyA9IGlubmVyX2pvaW4obWpfcHRzLCBsZWJyb25fcHRzLCBieSA9ICJHYW1lX051bWJlciIpICU+JQ0KICBzZWxlY3QoLUdhbWVfTnVtYmVyKQ0KDQpkYXRhdGFibGUocHRzKQ0KYGBgDQoNCg0KIyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzDQoNCiMjIFBpdm90IERhdGENCg0KYGBge3Igd2FybmluZz1GQUxTRX0NCg0KI1Bpdm90IHRoZSBkYXRhDQpwdHNfcGl2b3QgPSBwdHMgJT4lDQogIHBpdm90X2xvbmdlcigiTEVCUk9OX1BUUyI6Ik1KX1BUUyIsbmFtZXNfdG8gPSAiUGxheWVyIiwgdmFsdWVzX3RvID0gIlBUUyIpDQoNCmRhdGF0YWJsZShwdHNfcGl2b3QpDQpgYGANCg0KIyMgU3VtbWFyeSBTdGF0aXN0aWNzDQpgYGB7cn0NCg0KI0dhdGhlciBzdW1tYXJ5IHN0YXRpc3RpY3MNCnB0c19zdW1tYXJ5ID0gcHRzX3Bpdm90ICU+JQ0KICBncm91cF9ieShQbGF5ZXIpICU+JQ0KICBzdW1tYXJpc2UobiA9IG4oKSwNCiAgICAgICAgICAgIG1lYW4gPSBtZWFuKFBUUywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHNkID0gc2QoUFRTLCBuYS5ybSA9IFRSVUUpKQ0KDQprbml0cjo6a2FibGUocHRzX3N1bW1hcnkpDQoNCmBgYA0KDQpUaGlzIHN0dWR5IGFuYWx5emVzIDEwMjAgZ2FtZXMgcGxheWVkIGJ5IExlQnJvbiBKYW1lcyBhbmQgTWljaGFlbCBKb3JkYW4uIFRoZSBtZWFuIHBvaW50cy1wZXItZ2FtZSBzY29yZWQgYnkgTGVCcm9uIGlzIGFwcHJveGltYXRlbHkgMjcuMTggYW5kIE1pY2hhZWwncyBpcyAzMC4yMi4gRnJvbSBhIHN1cmZhY2UgbGV2ZWwgdmlldywgaXQgaXMgY2xlYXIgdGhhdCBNaWNoYWVsIGhhZCBhIGhpZ2hlciBhdmVyYWdlIHBvaW50cy1wZXItZ2FtZSBzY29yZWQsIGJ1dCB0aGUgcXVlc3Rpb24gcmVtYWluczogaXMgaXQgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2U/IEluIHRoZSBjb250ZXh0IG9mIGEgYmFza2V0YmFsbCBnYW1lLCBhIDMgcG9pbnQgZGVmaWNpdCBpcyBhIHNtYWxsIG1hcmdpbi4gSG93ZXZlciwgaW4gdGhlIGNvbnRleHQgb2Ygc3RhdGlzdGljcywgdGhlIHNpZ25pZmljYW5jZSBpcyB5ZXQgdG8gYmUgZGV0ZXJtaW5lZC4gTmV4dCB3ZSB3aWxsIHZpc3VhbGl6ZSB0aGUgZGF0YSB0byBnZXQgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgZGlzdHJpYnV0aW9uLg0KDQoNCiMjIERhdGEgVmlzdWFsaXphdGlvbnMNCg0KIyMjIEhpc3RvZ3JhbQ0KDQpgYGB7cn0NCg0KI2hpc3RvZ3JhbQ0KaGlzdCA8LSBwdHNfcGl2b3QgJT4lDQogIGdncGxvdChtYXBwaW5nPWFlcyh4ID0gUFRTLCBmaWxsPVBsYXllcikpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1KSANCg0KaGlzdA0KDQpgYGANCg0KRnJvbSB0aGUgaGlzdG9ncmFtLCBpdCBpcyBjbGVhciB0aGF0IGFsdGhvdWdoIE1pY2hhZWwgSm9yZGFuIGhhcyBhIHNsaWdodGx5IGhpZ2hlciBtZWFuIHBvaW50cy1wZXItZ2FtZSB0aGFuIExlQnJvbiBKYW1lcywgTGVCcm9uIGhhcyBhIG11Y2ggaGlnaGVyIHBvaW50IHRvdGFsIHRoYW4gTWljaGFlbCB0aHJvdWdob3V0IHRoZSBzYW1wbGUgMTAyMCBnYW1lcy4gVGhpcyByYWlzZXMgdGhlIHF1ZXN0aW9uOiBIb3cgY291bGQgTGVCcm9uIGhhdmUgbW9yZSB0b3RhbCBwb2ludHMgYnV0IGEgc21hbGxlciBtZWFuIG92ZXJhbGw/IFRoaXMgaXMgYmVjYXVzZSB0aGUgZGF0YSBhbmFseXplcyBwb2ludHMtcGVyLWdhbWUsIG5vdCB0b3RhbCBwb2ludHMgc2NvcmVkLiBUaGlzIGluZGljYXRlcyB0aGF0IExlQnJvbiBtYXkgaGF2ZSBtYW55IG91dGxpZXJzIChnYW1lcyB3aGVyZSBoZSBzY29yZWQgbXVjaCBtb3JlIG9yIG11Y2ggbGVzcyB0aGFuIG5vcm1hbCkuIFRoZXJlZm9yZSB3ZSBjYW4gY29uY2x1ZGUgdGhhdCBMZUJyb24gaGFzIHNjb3JlZCBtdWNoIG1vcmUgcG9pbnRzIG92ZXJhbGwsIGJ1dCBvbiBhIHBlci1nYW1lIGJhc2lzLCBNaWNoYWVsIEpvcmRhbiBoYXMgdGhlIGhpZ2hlciBhdmVyYWdlIHBvaW50IHRvdGFsLg0KDQoNCiMjIyBCb3hwbG90DQoNCmBgYHtyfQ0KIyBib3hwbG90DQpicCA8LSBwdHNfcGl2b3QgJT4lDQogIGdncGxvdChtYXBwaW5nPWFlcyh4PVBUUywgZmlsbD1QbGF5ZXIpKSArDQogIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG9yID0gIiNGNTY2MDAiLCANCiAgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZSA9IDMuMCkgDQpicA0KYGBgDQoNCkEgc2ltaWxhciBjb25jbHVzaW9uIGNhbiBiZSBkcmF3biBmcm9tIHRoZSBib3hwbG90LiBXaGF0IHdlIGNhbiBjbGVhcmx5IHNlZSBpcyB0aGUgaGlnaCBudW1iZXIgb2Ygb3V0bGllcnMgZm9yIExlQnJvbidzIHBvaW50IHRvdGFscyB3aGljaCBjb3VsZCBiZSBza2V3aW5nIHRoZSBkYXRhLiBUaGVzZSBvdXRsaWVycyBhcmUgcmVhc29uYWJsZSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYmFza2V0YmFsbCBiZWNhdXNlIHBsYXllciBwZXJmb3JtYW5jZSB2YXJpZXMgdGhyb3VnaG91dCB0aGUgc2Vhc29uIGR1ZSB0byBudW1lcm91cyBleHRlcm5hbCBmYWN0b3JzLiBIb3dldmVyLCBpdCBpcyBzdGlsbCBjbGVhciB0aGF0IE1pY2hhZWwgSm9yZGFuIHJldGFpbnMgdGhlIGhpZ2hlciBtZWFuIHBvaW50cy1wZXItZ2FtZS4gVGhpcyBpcyBpbXBvcnRhbnQgdG8gbm90ZSBiZWNhdXNlIExlQnJvbiBKYW1lcyBwbGF5ZWQgbW9yZSBnYW1lcyB0b3RhbCB0aGFuIE1pY2hhZWwgSm9yZGFuIHNvIGFuYWx5emluZyBtZWFuIHBvaW50cy1wZXItZ2FtZSBpcyBhIG1vcmUgYWNjdXJhdGUgcmVwcmVzZW50YXRpb24gdGhhbiBzaW1wbHkgdG90YWwgcG9pbnRzIHNjb3JlZC4NCg0KIyMjIFFRUGxvdA0KDQpgYGB7cn0NCiMgcXEgcGxvdA0KZ2dxcXBsb3QocHRzX3Bpdm90LCB4PSJQVFMiLCBmYWNldC5ieSA9ICJQbGF5ZXIiKQ0KDQpgYGANCg0KVGhlIFFRUGxvdCBjb25maXJtcyB0aGF0IGJvdGggZGF0YXNldHMgZm9sbG93IGFuIGFwcHJveGltaWF0ZWx5IG5vcm1hbCBkaXN0cmlidXRpb24uIFRoZXJlIGlzIGluc3VmZmljaWVudCBldmlkZW5jZSB0byBzdWdnZXN0IG90aGVyd2lzZS4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgQW5hbHlzaXMNCg0KIyMgUGVyZm9ybSBUd28gU2FtcGxlIFQgVGVzdA0KDQokJCBIXzA6IFxtdV8xID0gXG11XzIgJCQNCg0KJCQgSF9BOiBcbXVfMSBcbmUgXG11XzIgJCQNCg0KYGBge3J9DQoNCiMgcGVyZm9ybSB0IHRlc3QNCnRlc3QgPC0gcHRzX3Bpdm90ICU+JSANCiAgdF90ZXN0KFBUUyB+IFBsYXllcikgJT4lDQogIGFkZF9zaWduaWZpY2FuY2UoKQ0KDQojIG5pY2UgcHJpbnQgb2Ygb3V0cHV0DQprbml0cjo6IGthYmxlKHRlc3QsIGFsaWduPSJjIiwgZm9ybWF0ID0gImh0bWwiKSAlPiUNCiAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpDQoNCmBgYA0KT3V0IG9mIHRoZSBzYW1wbGUgMTAyMCBnYW1lcyBhbmFseXplZCBieSBlYWNoIHBsYXllciwgSSBwZXJmb3JtZWQgYSBoeXBvdGhlc2lzIHRlc3QgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtZWFuIHBvaW50cy1wZXItZ2FtZSBzY29yZWQgYnkgTWljaGFlbCBKb3JkYW4gYW5kIExlQnJvbiBKYW1lcyB3ZXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGluIGEgc3RhdGlzdGljYWwgcG9pbnQtb2Ytdmlldy4gVGhlIHJlc3VsdGluZyBwLXZhbHVlIGlzIDAuMDAgd2hpY2ggaXMgbXVjaCBsb3dlciB0aGFuIGEgcmVhc29uYWJsZSBhbHBoYSBsZXZlbC4NCg0KIyBTdW1tYXJ5DQoNCkEgdHdvLXNhbXBsZSB0LXRlc3Qgd2FzIGNvbXB1dGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBwb3B1bGF0aW9uIG1lYW4gcG9pbnRzLXBlci1nYW1lIGJ5IE1pY2hhZWwgSm9yZGFuIHdhcyBzaWduaWZpY2FudGx5IGhpZ2hlciBmcm9tIHRoZSBwb3B1bGF0aW9uIG1lYW4gcG9pbnRzLXBlci1nYW1lIGJ5IExlQnJvbiBKYW1lcy4NCg0KU2luY2UgdGhlIHAtdmFsdWUgKDApIGlzIGxlc3MgdGhhbiBhbnkgcmVhc29uYWJsZSBhbHBoYSBsZXZlbCwgd2UgcmVqZWN0IG91ciBudWxsIGh5cG90aGVzaXMuIFRoZXJlIElTIHN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gc3VnZ2VzdCB0aGF0IHRoZSBwb3B1bGF0aW9uIG1lYW4gcG9pbnRzLXBlci1nYW1lIHNjb3JlZCBieSBNaWNoYWVsIEpvcmRhbiBpcyBzaWduaWZpY2FudGx5IGdyZWF0ZXIgdGhhbiB0aGUgcG9wdWxhdGlvbiBtZWFuIHBvaW50cy1wZXItZ2FtZSBzY29yZWQgYnkgTGVCcm9uIEphbWVzLg0KDQo8Y2VudGVyPg0KDQohW10oSm9yZGFuTGVicm9uU3RhdHNfR2V0dHlfUmluZ2VyLjAucG5nKXt9DQoNCjwvY2VudGVyPg0KDQojIFJlZmVyZW5jZXMNCg0KaHR0cHM6Ly93d3cuYmFza2V0YmFsbC1yZWZlcmVuY2UuY29tL3BsYXllcnMvai9qb3JkYW1pMDEuaHRtbA0KDQpodHRwczovL3d3dy5iYXNrZXRiYWxsLXJlZmVyZW5jZS5jb20vcGxheWVycy9qL2phbWVzbGUwMS5odG1sDQo=